#ifndef __MY_ELF_LOADER__
#define __MY_ELF_LOADER__
/*
ELF-Header
Der ELF-Header ist wie folgt aufgebaut.
             offs  siz
e_ident	    0x00	 16	 Enthält Daten zur Identifikation
e_type	    0x10	 2	 Enthält den ELF-Typ
e_machine	 0x12	 2	 Beschreibt die benötigte Architektur
e_version	 0x14	 4	 Version
e_entry	    0x18	 4	 Entrypoint
e_phoff	    0x1C	 4	 Das Offset des Programm-Headers
e_shoff	    0x20	 4	 Das Offset des Section-Headers
e_flags	    0x24	 4	 Verschiedene Flags
e_ehsize  	 0x28	 2	 Größe des ELF-Headers
e_phentsize	 0x2A	 2	 Größe eines Eintrags im Programm-Header
e_phnum	    0x2C	 2	 Anzahl an Einträgen im Programm-Header
e_shentsize	 0x2E	 2	 Größe eines Eintrags im Section-Header
e_shnum	    0x30	 2	 Anzahl an Einträgen im Section-Header
e_shstrndex	 0x32	 2	 Assoziiert einen Eintrag im Section-Header mit der String-Tabelle
*/
struct ElfHeader {
    unsigned char ident[16];
    unsigned short type;
    unsigned short arch;
    unsigned int version;
    unsigned int entry;
    unsigned int programHeaderOffset;
    unsigned int sectionHeaderOffset;
    unsigned int divFlags;
    unsigned short sizeOfElfHeader;
    unsigned short sizeOfProgrammHeaderEntry;
    unsigned short countProgrammHeaderEntrys;
    unsigned short sizeOfSectionHeaderEntry;
    unsigned short countSectionHeaderEntrys;
    unsigned short stringIndex;
};

/*
p_type	 0x00	 4	 Typ des Segments
p_offset	 0x04	 4	 Dateioffset, an dem das Segment steht
p_vaddr	 0x08	 4	 Virtuelle Adresse, an die das Segment kopiert werden soll
p_paddr	 0x0C	 4	 Physische Adresse (meist irrelevant)
p_filesz	 0x10	 4	 Größe des Segments in der Datei
p_memsz	 0x14	 4	 Größe des Segments, das es im Speicher haben soll
p_flags	 0x18	 4	 Flags
p_align	 0x1C	 4	 Alignment
*/
struct ElfProgramHeader {
    unsigned int type;
    unsigned int fileOffset;
    unsigned int vAddr;
    unsigned int pAddr;
    unsigned int fileSegmentSize;
    unsigned int fileMemorySize;
    unsigned int flags;
    unsigned int alignment;
};

/*
Elf TYPES:
ET_NONE	 0	 Kein Typ
ET_REL	 1	 Relocatable Datei
ET_EXEC	 2	 Ausführbare Datei
ET_DYN	 3	 Shared-Object-Datei
ET_CORE	 4	 Kerndatei
*/
#define ET_NONE	 0
#define ET_REL	    1
#define ET_EXEC	 2
#define ET_DYN	    3
#define ET_CORE	 4

/*
Segment TYPES:
PT_NULL	    0	 Ungültiges Segment
PT_LOAD	    1	 Ladbares Segment
PT_DYNAMIC	 2	 Dynamisches Segment
PT_INTERP	 3	 Position eines 0-terminierten Strings, der den Interpreter angibt.
PT_NOTE	    4	 Universelles Segment
PT_SHLIB	    5	 Shared Lib
PT_PHDIR	    6	 Gibt Position und Größe des Programm-Headers an.
PT_TLS	    7  Thread-Local Storage
*/

#define PT_NULL	 0
#define PT_LOAD    1
#define PT_DYNAMIC 2
#define PT_INTERP	 3
#define PT_NOTE	 4
#define PT_SHLIB	 5
#define PT_PHDIR	 6
#define PT_TLS	    7

void loadElfBinary(char* path);

#endif
